package com.Book.test_1_25_springmvcbook;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Test125SpringMvcBookApplication {

	public static void main(String[] args) {
		SpringApplication.run(Test125SpringMvcBookApplication.class, args);
		// 图书管理系统,
		// 先去定义先后端交互接口
		//  1. 登录
		// URL:  /user/login
		// 参数:  userName=? &password= ?
		// 响应:  true/false
		//  2. 图书列表的展示
		// URL: /book/getBookList
		// 参数: 无
		// 响应: List<Book>


		// 回过头来看代码, 发现还是很乱
		// 这时候要提到一个思想
		// 应用分层
		// 三层架构思想:
		// 1. 表现层   : 接收请求, 返回结果
		// 2. 业务逻辑层  : 主要处理业务逻辑
		// 3.数据层: 处理数据,包含数据的存储, 获取(增删改查)

		// Spring 也提供了这些思想
		// Controller ---- > Service ------ > Dao ----- >DB
		// Controller : 接收请求, 参数是否合法, 结果的响应
		// Service: 真正干活的部分, 处理业务的逻辑
		// Dao: 数据的存储


		// 当Tomcat端口号被占用的时候, 就可以 用Spring 自己给我们配置的端口修改服务
		// 端口号的范围是  0 ~~ 65537 , 建议 1024 之前的不要使用
		// 根据这个可以让我们就该一些配置
		// 在resources包的 application 里面 进行修改


		// 图书管理系统的升级

		// 后端实现分页系统
		// 使用 limit 语句
		// select * from book_info limit ${offset},${limit}
		// 后端要实现: offset, limit
		//  limit 就是每页要显示的条数 pageSize
		// 这个条数 要通过前端来告诉我们
		// 1. 当前页 : currentPage
		// 2. 每页显示的条数: pageSize
		// 这两者的关系有  offset =   (currentPage - 1) * pageSize

		// 后端需要返回的结果:
		// 1.当前页的内容 records
		// 2.总条数

		// 接下来定义接口
		// [请求]
		///book/getListByPage?currentPage=1&pageSize=10
		//Content-Type: application/x-www-form-urlencoded; charset=UTF-8
		//[参数] 无
		//[响应]
		//Content-Type: application/json
		// {
		// "total": 25,
		// "records": [{
		// "id": 25,
		// "bookName": "图书21",
		// "author": "作者2",
		// "count": 29,
		// "price": 22.00,
		// "publish": "出版社1",
		// "status": 1,
		// "statusCN": "可借阅"
		// }, {
		// ......
		// } ]
		//}

		// controller 通常做的事情: 1. 参数校验 2. 对service 返回的格式进行转换(如果有需要)


		// 添加图书

		// 接口定义:
		// url: book/addBook
		// 参数: BookInfo 对象来接收
		// 返回结果: 告诉前端, 添加是否成功
		// 			1)使用Boolean, 返回 true 就是成功, 反之就是失败
		//			2)使用 String , 返回""添加成功, 不为空则添加失败
		//			3)使用 对象, boolean result 是否添加成功, 出错时: 来个 String 来说明错误原因
		// 此处使用 第二种方式


		// 接下来进行修改操作
		// 点击修改按钮时, 希望把当前图书的信息显示出来
		// 点击确定是, 把修改的结果进行保存

		// 所以需要两个接口
		// 1. 查询图书信息, 根据 id 去查询
		// 		url: /book/queryBookInfoById
		//  	参数: bookId
		//  	返回的结果: 对应的图书信息 BookInfo.
		// 2. 修改图书
		//		url: /book/updateBook
		//		参数: BookInfo
		//		返回结果: 告诉前端是否修改成功, 返回一个字符串类型的
		//				如果为空表示返回成功, 如果不为空则表示返回错误信息	.


		// 接下来进行删除操作
		// delete 通常是在数据修复时进行使用
		// 这里实现的是逻辑上的删除 (通过字段表示, 表示这个数据被删除了)

		// 接口定义:
		// /book/deleteBook
		// 参数: bookId
		// 返回内容: 空的话就表示删除成功, 不为空, 就表示删除失败,并返回失败的原因

		// 如果采用 逻辑删除
		// 那么接口的定义就又发生变化了
		// url: /book/updateBook  还可以使用更新的接口
		// 参数: 告诉 bookId =
		// 			status = 0
		// 返回 和 updateBook保持一样 空的话就表示删除成功, 不为空, 就表示删除失败,并返回失败的原因
		// 通过实验, 完全可以通过 更新的方式来实现删除
		// 所以后端代码已经有了, 只需要实现前端内容就可以了

		// 批量删除操作
		// 接口如何定义以及开发
		// 因为采用逻辑删除, 所以批量删除就是批量更新
		// 所以 批量更新 要传递的是 ids: 需要批量删除的图书的id 的集合
		// 接口的定义
		// url:/book/batchDelete
		// 参数: List<Integer> ids
		// 返回: 空的话就表示删除成功, 不为空, 就表示删除失败,并返回失败的原因

		// 强制登录的实现
		// 那就是 过滤器
		// 用 // * 表示加上强制登录而修改之后的代码

		// 当然修改的时候 不能每一个模块都要加上呢么写
		// 那就需要 拦截器 了
		// SpringBoot统一功能的处理
		// 什么是拦截器?
		//拦截器是Spring框架提供的核⼼功能之⼀, 主要⽤来拦截⽤⼾的请求, 在指定⽅法前后, 根据业务需要执
		//⾏预先设定的代码.
		// 指定方法前后,是指定哪些方法的前后
		// 如登录验证中:
		// 指定方法: 指我们登录验证的某些方法(比如图书的增删改查)
		// 预先设定的代码: 对用户是否登录进行验证
		// 这是一个拦截器的思想

		// 拦截器的实现: 分两步:
		// 第一步: 要先定义一个拦截器
		// 第二步: 把拦截器注册到项目中(实施)
		// 在 interceptor中展示

		// 拦截路径 含义 举例
		// /* ⼀级路径 能匹配/user，/book，/login，不能匹配 /user/login
		// /** 任意级路径 能匹配/user，/user/login，/user/reg
		// /book/* /book下的⼀级路径 能匹配/book/addBook，不能匹配/book/addBook/1，/book
		// /book/** /book下的任意级路径 能匹配/book，/book/addBook，/book/addBook/2，不能匹配/user/login
	}

}
